# 参考链接：https://blog.csdn.net/qq_39594033/article/details/107345231
# 数据文件：https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data
# 数据文件下载：https://note.youdao.com/coshare/index.html?token=C6B145FA919F41F8ACAAC39EE775441C&gid=93772390&_time=1707362129493
import pandas as pd
#导入 matplotlib 包中的 pyplot 函数，并更名为 plt
import matplotlib.pyplot as plt
# 导入 numpy 包（主要用其中的 random 函数产生随机数），并且更名为 mp
import numpy as np
# 从 sklearn 的 线性模型中 导入逻辑回归模块
from sklearn.linear_model import LogisticRegression

# 数据分析
def dataAnalyse():
    print("恶性肿瘤分析")
    # 0-常量定义
    folder_path = "./resources/"
    train_file_path = folder_path + "breast-cancer-train.csv"
    test_file_path = folder_path + "breast-cancer-test.csv"

    # 1-读取CSV文件
    # 调用 pandas 工具包的 read_csv 函数，传入地址参数，返回数据并且存至变量 df_train
    df_train = pd.read_csv(train_file_path)
    # 调用 pandas 工具包的 read_csv 函数，传入地址参数，返回数据并且存至变量 df_test
    df_test = pd.read_csv(test_file_path)
    # 查看pana数据类型，实际上是一个 pandas 核心的数据框（ DataFrame ）
    print(type(df_train))
    print(type(df_train.shape))

    # pandas 包的切片函数 数据框.loc[取行的条件，取列的条件]，
    # 这两步命令主要意思是在 df_test 数据框中选出 Type 为 0 的 Clump Thickness 和 Cell Size 值，
    # 组成一个数据框并且存至 df_test_negative 变量，同样 Type 为 1 的存入 df_test_positive 变量，分别表示阴性和阳性
    df_test_negative = df_test.loc[df_test['Type'] == 0][['Clump Thickness', 'Cell Size']]
    df_test_positive = df_test.loc[df_test['Type'] == 1][['Clump Thickness', 'Cell Size']]

    # 画出 阴性的散点图，以‘ o ’为标记，大小 200 ，颜色为红色
    plt.scatter(df_test_negative['Clump Thickness'], df_test_negative['Cell Size'], marker='o', s=200, c='red')
    # 画出 阳性的散点图，以‘ x ’为标记，大小 150 ，颜色为黑色
    plt.scatter(df_test_positive['Clump Thickness'], df_test_positive['Cell Size'], marker='x', s=150, c='black')

    # 用法：plt.scatter(数据集名['列名（横坐标）'],数据集名['列名（横坐标）'], marker = ' （记号）', s=（大小）, c='颜色')
    # 设置行标签为 Clump Thickness
    plt.xlabel('Clump Thickness')
    # 设置列标签为 Cell Size
    plt.ylabel('Cell Size')
    # 显示图
    plt.show()



    # 设置随机种子为 0 以确保每次运行结果一致
    np.random.seed(0)
    #用 random 函数产生一个随机数并存入 intercept 变量，作为直线截距
    intercept = np.random.random([1])
    #用 random 函数产生两个随机数并存入 coef 变量，作为系数
    coef = np.random.random([2])

    #打印出这个随机数
    print(intercept)

    #产生一个 0 到 11 ，即 0 ...11的序列存入 lx
    lx = np.arange(0, 12)
    #利用随机生成的 intercept coef[0] coef[1] 计算 ly,  coef[0]x+coef[1]y=intercept
    ly = (-intercept - lx * coef[0]) / coef[1]

    #利用 plt 函数画出这条直线，其中 lx 为横坐标，ly 为纵坐标，颜色为黄色
    plt.plot(lx, ly, c='yellow')


    #画出 阴性的散点图，以‘ o ’为标记，大小 200 ，颜色为红色
    plt.scatter(df_test_negative['Clump Thickness'],df_test_negative['Cell Size'], marker = 'o', s=200, c='red')
    #画出 阳性的散点图，以‘ x ’为标记，大小 150 ，颜色为黑色
    plt.scatter(df_test_positive['Clump Thickness'],df_test_positive['Cell Size'], marker = 'x', s=150, c='black')

    #用法：plt.scatter(数据集名['列名（横坐标）'],数据集名['列名（横坐标）'], marker = ' （记号）', s=（大小）, c='颜色')
    #设置行标签为 Clump Thickness
    plt.xlabel('Clump Thickness')
    #设置列标签为 Cell Size
    plt.ylabel('Cell Size')
    #显示图
    plt.show()

    # 初始化一个 Logistic 回归，类
    lr = LogisticRegression()

    # lr.fit:根据已有数据，训练出回归模型
    # lr.fit调用格式：lr.fit(自变量（矩阵)，因变量)
    lr.fit(
        df_train[['Clump Thickness', 'Cell Size']][:10],  # 自变量：训练集的前十行的 'Clump Thickness'与 'Cell Size' 两列
        df_train['Type'][:10]  # 因变量：训练集前10行的 'Type'
    )
    # lr.score:将训练出的 lr 模型应用于指定数据，返回正确率
    print('Testing accuracy (10 training samples):',
          lr.score(df_test[['Clump Thickness', 'Cell Size']], df_test['Type']))

    # 返回 lr 模型的截距;一个只包含一个数的 array
    intercept = lr.intercept_
    # 返回 lr 模型的斜率；包含两个数的 array
    coef = lr.coef_[0, :]

    # 产生一个 0 到 11 ，即 0 ...11的序列存入 lx
    lx0 = np.arange(0, 12)
    # 利用 intercept coef[0] coef[1] 计算 ly,  coef[0]x+coef[1]y=intercept
    # 给出线性模型表达式
    ly = (-intercept - lx0 * coef[0]) / coef[1]

    # 绘制分类器超平面
    plt.plot(lx0, ly, c='green')

    ##画出 阴性的散点图，以‘ o ’为标记，大小 200 ，颜色为红色
    plt.scatter(df_test_negative['Clump Thickness'], df_test_negative['Cell Size'], marker='o', s=200, c='red')
    # 画出 阳性的散点图，以‘ x ’为标记，大小 150 ，颜色为黑色
    plt.scatter(df_test_positive['Clump Thickness'], df_test_positive['Cell Size'], marker='x', s=150, c='black')

    # 用法：plt.scatter(数据集名['列名（横坐标）'],数据集名['列名（横坐标）'], marker = ' （记号）', s=（大小）, c='颜色')
    # 设置行标签为 Clump Thickness
    plt.xlabel('Clump Thickness')
    # 设置列标签为 Cell Size
    plt.ylabel('Cell Size')
    # 显示图
    plt.show()

def print_hi(name):
    # 在下面的代码行中使用断点来调试脚本。
    print(f'Hi, {name}')  # 按 ⌘F8 切换断点。


# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
    print_hi('PyCharm')
    dataAnalyse()

# 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助
